package dashboardhandler

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/shopspring/decimal"
	"log"
	"strconv"
	"sync"
	"time"
	"yundian/internel/app/dao"
	"yundian/internel/app/helper"
	"yundian/internel/app/helper/request"
	"yundian/internel/app/helper/resphelper"
	"yundian/internel/app/helper/resphelper/placeresp"
	"yundian/internel/app/models/devices"
	"yundian/internel/pkg/dingo"
	"yundian/internel/pkg/dingo/global"
	. "yundian/internel/pkg/dingo/result"
	"yundian/internel/pkg/utils"
)

func HandleTestTask(ctx *gin.Context) {
	//log.Println("测试接口")
	////testTask()
	//dingo.Task(testTask, func() {})  // 执行异步任务
	//log.Println("执行完成")
}
func testTask(param ...interface{}) {
	log.Println("执行了异步任务")
	time.Sleep(20 * time.Second)
	a := &struct {
		Name string
	}{
		Name: "test",
	}
	db := global.Orm.Table("a").Create(a)
	if db.Error != nil {
		log.Println("出错了")
	}
	log.Println("异步任务执行结束")
}

//func GetLineCount(ctx *gin.Context) {
//	// 总销售  总订单 设备总数
//	userId, err := helper.GetUserIdFromCtx(ctx)
//	if err != nil {
//		Response(ctx)(err.Error(), CodeNeedLogin, nil)(Unauthorized)
//		return
//	}
//	isAdmin, err := helper.GetIsAdminFromCtx(ctx)
//	if err != nil {
//		Response(ctx)(err.Error(), CodeNeedLogin, nil)(Unauthorized)
//		return
//	}
//
//	isPlace, err := helper.GetIsPlaceFromCtx(ctx)
//	if err != nil {
//		Response(ctx)(err.Error(), CodeNeedLogin, nil)(Unauthorized)
//		return
//	}
//
//	//查询用户
//	//userInfo := dao.NewUserDao().GetAgentUserListById(userId).Unwrap().(*users.UserModel)
//	var balance, tbalance string
//	var todayMoney, yesMoney, todayzz, week, yesWeek, lastWeek, weekzz, totalMoney, totalCount, deviceCount, todayOrderCount, usedDevice, deployDevice int64
//	var deviceTypeCount []devices.DeviceTotal
//	//分公司
//	if isPlace == 3 {
//		//没有抽单权限
//		// 余额 = (分红+抽单)-提现
//		d := dao.NewOrderDao().GetDividendsMoneyByUserId(userId).Unwrap().(int64) // 分红
//		//t := dao.NewOrderDao().GetTakeTotalMoneyByUserId(userId).Unwrap().(int64) // 抽单
//		c := dao.NewOrderDao().GetCashLogByUserId(userId).Unwrap().(int64) // 提现
//		//balance = utils.Fen2Yuan((d + t) - c)                                     // 余额
//		balance = decimal.NewFromInt(d).Sub(decimal.NewFromInt(c)).
//			Div(decimal.NewFromInt(100)).Truncate(2).String()
//
//		// 今日入帐 = (分红+抽单)-提现
//		td := dao.NewOrderDao().GetTodayDividendsMoneyByUserId(userId).Unwrap().(int64) // 当天分红
//		//tt := dao.NewOrderDao().GetTodayTakeTotalMoneyByUserId(userId, isAdmin).Unwrap().(int64) // 当天抽单
//		tc := dao.NewOrderDao().GetTodayCashLogByUserId(userId).Unwrap().(int64) // 当天提现
//		//tbalance = utils.Fen2Yuan((td + tt) - tc)                                        // 当天入帐
//		tbalance = decimal.NewFromInt(td).Sub(decimal.NewFromInt(tc)).
//			Div(decimal.NewFromInt(100)).Truncate(2).String()
//
//		childUserIds := dao.NewUserDao().QueryChildUserIds(userId).Unwrap().([]int)
//		placesIdArr := dao.NewUserDao().GetPlacesIds(userId, childUserIds).Unwrap().([]int)
//
//		//当天的销售额
//		todayMoney = dao.NewOrderDao().QueryPlacesTodayTotalMoney(time.Now().Format("2006-01-02"), placesIdArr).Unwrap().(int64) // 当天的销售额
//
//		// 前日销售额
//		//lastMoney := dao.NewOrderDao().
//		//	GetTodayTotalMoney(time.Now().AddDate(0, 0, -2).Format("2006-01-02")).
//		//	Unwrap().(int64)
//		// 昨日销售额
//		yesMoney = dao.NewOrderDao().
//			QueryPlacesTodayTotalMoney(time.Now().AddDate(0, 0, -1).Format("2006-01-02"), placesIdArr).
//			Unwrap().(int64)
//		todayzz = (todayMoney - yesMoney) / 100 // 日同比
//		//todayzz := (yesMoney - lastMoney) / 100 // 日同比
//
//		//week = dao.NewOrderDao().GetWeekTotalMoney(0).Unwrap().(int64)     // 本周
//		yesWeek = dao.NewOrderDao().GetWeekTotalMoneyPlaces(1, placesIdArr).Unwrap().(int64) // 上周
//		//lastWeek = dao.NewOrderDao().GetWeekTotalMoney(2).Unwrap().(int64) // 上上周
//
//		//weekzz := (week - yesWeek) / 100                                   // 周同比
//		//weekzz = (yesWeek - lastWeek) / 100 // 周同比
//
//		dataTotalMoney := dao.NewOrderDao().GetTotalMoneyPlaces(placesIdArr)
//		totalMoney = dataTotalMoney.Unwrap().(int64) // 已结算的订单总金额
//		totalCount = dataTotalMoney.Val().(int64)    // 已结算的订单总笔数
//		deviceCount = dao.NewDeviceDao().GetDeviceCountPlaces(placesIdArr).Unwrap().(int64)
//		todayOrderCount = dao.NewOrderDao().GetTodayOrderCountPlaces(time.Now().Format("2006-01-02"), placesIdArr).Unwrap().(int64)
//
//		usedDevice = dao.NewDeviceDao().GetUsedDeviceTotalPlaces(placesIdArr).Unwrap().(int64)     //获取代理设备总条数
//		deployDevice = dao.NewDeviceDao().GetDeployDeviceTotalPlaces(placesIdArr).Unwrap().(int64) //已部署密码线统计
//		deviceTypeCount = dao.NewDeviceDao().GetDeviceTotalByTypePlaces(placesIdArr).Unwrap().([]devices.DeviceTotal)
//
//	}
//
//	//代理商
//	if isAdmin == 3 && isPlace != 3 { // 代理商 如果也享受抽单功能的话，需要判断一下
//		log.Println(userId)
//		//查询代理商是否能抽单
//		_, rowsAffected := dao.NewUserDao().GetAgentIsDraw(userId)
//
//		//享受抽单功能
//		if rowsAffected > 0 {
//			// 余额 = (分红+抽单)-提现
//			d := dao.NewOrderDao().GetDividendsMoneyByUserId(userId).Unwrap().(int64) // 分红
//			//t := dao.NewOrderDao().GetTakeTotalMoneyByUserId(userId).Unwrap().(int64) // 抽单
//			c := dao.NewOrderDao().GetCashLogByUserId(userId).Unwrap().(int64) // 提现
//			//balance = utils.Fen2Yuan((d + t) - c)                                     // 余额
//			balance = decimal.NewFromInt(d).Sub(decimal.NewFromInt(c)).
//				Div(decimal.NewFromInt(100)).Truncate(2).String()
//
//			// 今日入帐 = (分红+抽单)-提现
//			td := dao.NewOrderDao().GetTodayDividendsMoneyByUserId(userId).Unwrap().(int64) // 当天分红
//			//tt := dao.NewOrderDao().GetTodayTakeTotalMoneyByUserId(userId, isAdmin).Unwrap().(int64) // 当天抽单
//			tc := dao.NewOrderDao().GetTodayCashLogByUserId(userId).Unwrap().(int64) // 当天提现
//			//tbalance = utils.Fen2Yuan((td + tt) - tc)                                        // 当天入帐
//			tbalance = decimal.NewFromInt(td).Sub(decimal.NewFromInt(tc)).
//				Div(decimal.NewFromInt(100)).Truncate(2).String()
//		} else {
//			//没有抽单权限
//			// 余额 = (分红+抽单)-提现
//			d := dao.NewOrderDao().GetDividendsMoneyByUserId(userId).Unwrap().(int64) // 分红
//			//t := dao.NewOrderDao().GetTakeTotalMoneyByUserId(userId).Unwrap().(int64) // 抽单
//			c := dao.NewOrderDao().GetCashLogByUserId(userId).Unwrap().(int64) // 提现
//			//balance = utils.Fen2Yuan((d + t) - c)                                     // 余额
//			balance = decimal.NewFromInt(d).Sub(decimal.NewFromInt(c)).
//				Div(decimal.NewFromInt(100)).Truncate(2).String()
//
//			// 今日入帐 = (分红+抽单)-提现
//			td := dao.NewOrderDao().GetTodayDividendsMoneyByUserId(userId).Unwrap().(int64) // 当天分红
//			//tt := dao.NewOrderDao().GetTodayTakeTotalMoneyByUserId(userId, isAdmin).Unwrap().(int64) // 当天抽单
//			tc := dao.NewOrderDao().GetTodayCashLogByUserId(userId).Unwrap().(int64) // 当天提现
//			//tbalance = utils.Fen2Yuan((td + tt) - tc)                                        // 当天入帐
//			tbalance = decimal.NewFromInt(td).Sub(decimal.NewFromInt(tc)).
//				Div(decimal.NewFromInt(100)).Truncate(2).String()
//		}
//
//		userIdArr := dao.NewUserDao().QueryChildUserIds(userId).Unwrap().([]int)
//		log.Println(userIdArr)
//
//		//当天的销售额
//		todayMoney = dao.NewOrderDao().QueryChildTodayTotalMoney(time.Now().Format("2006-01-02"), userIdArr).Unwrap().(int64) // 当天的销售额
//
//		// 前日销售额
//		//lastMoney := dao.NewOrderDao().
//		//	GetTodayTotalMoney(time.Now().AddDate(0, 0, -2).Format("2006-01-02")).
//		//	Unwrap().(int64)
//		// 昨日销售额
//		yesMoney = dao.NewOrderDao().
//			QueryChildTodayTotalMoney(time.Now().AddDate(0, 0, -1).Format("2006-01-02"), userIdArr).
//			Unwrap().(int64)
//		todayzz = (todayMoney - yesMoney) / 100 // 日同比
//		//todayzz := (yesMoney - lastMoney) / 100 // 日同比
//
//		//week = dao.NewOrderDao().GetWeekTotalMoney(0).Unwrap().(int64)     // 本周
//		yesWeek = dao.NewOrderDao().GetWeekTotalMoneyChild(1, userIdArr).Unwrap().(int64) // 上周
//		//lastWeek = dao.NewOrderDao().GetWeekTotalMoney(2).Unwrap().(int64) // 上上周
//
//		//weekzz := (week - yesWeek) / 100                                   // 周同比
//		//weekzz = (yesWeek - lastWeek) / 100 // 周同比
//
//		dataTotalMoney := dao.NewOrderDao().GetTotalMoneyChild(userIdArr)
//		totalMoney = dataTotalMoney.Unwrap().(int64) // 已结算的订单总金额
//		totalCount = dataTotalMoney.Val().(int64)    // 已结算的订单总笔数
//		deviceCount = dao.NewDeviceDao().GetDeviceCountChild(userIdArr).Unwrap().(int64)
//		todayOrderCount = dao.NewOrderDao().GetTodayOrderCountChild(time.Now().Format("2006-01-02"), userIdArr).Unwrap().(int64)
//
//		usedDevice = dao.NewDeviceDao().GetUsedDeviceTotalChild(userIdArr).Unwrap().(int64)
//		deployDevice = dao.NewDeviceDao().GetDeployDeviceTotalChild(userIdArr).Unwrap().(int64)
//		deviceTypeCount = dao.NewDeviceDao().GetDeviceTotalByTypeChild(userIdArr).Unwrap().([]devices.DeviceTotal)
//
//	}
//	// 运营商或管理员
//	if isAdmin == 2 {
//
//		// 余额 = (分红+抽单)-提现
//		d := dao.NewOrderDao().GetDividendsMoneyByUserId(userId).Unwrap().(int64) // 分红
//		//t := dao.NewOrderDao().GetTakeTotalMoneyByUserId(userId).Unwrap().(int64) // 抽单
//		c := dao.NewOrderDao().GetCashLogByUserId(userId).Unwrap().(int64) // 提现
//		//balance = utils.Fen2Yuan((d + t) - c)                                     // 余额
//		balance = decimal.NewFromInt(d).Sub(decimal.NewFromInt(c)).
//			Div(decimal.NewFromInt(100)).Truncate(2).String()
//
//		// 今日入帐 = (分红+抽单)-提现
//		td := dao.NewOrderDao().GetTodayDividendsMoneyByUserId(userId).Unwrap().(int64) // 当天分红
//		//tt := dao.NewOrderDao().GetTodayTakeTotalMoneyByUserId(userId, isAdmin).Unwrap().(int64) // 当天抽单
//		tc := dao.NewOrderDao().GetTodayCashLogByUserId(userId).Unwrap().(int64) // 当天提现
//		//tbalance = utils.Fen2Yuan((td + tt) - tc)                                                // 当天入帐
//		tbalance = decimal.NewFromInt(td).Sub(decimal.NewFromInt(tc)).
//			Div(decimal.NewFromInt(100)).Truncate(2).String()
//
//		todayMoney = dao.NewOrderDao().
//			GetTodayTotalMoney(time.Now().Format("2006-01-02")).Unwrap().(int64) // 当天的销售额
//		// 前日销售额
//		//lastMoney := dao.NewOrderDao().
//		//	GetTodayTotalMoney(time.Now().AddDate(0, 0, -2).Format("2006-01-02")).
//		//	Unwrap().(int64)
//		// 昨日销售额
//		yesMoney = dao.NewOrderDao().
//			GetTodayTotalMoney(time.Now().AddDate(0, 0, -1).Format("2006-01-02")).
//			Unwrap().(int64)
//		todayzz = (todayMoney - yesMoney) / 100 // 日同比
//		//todayzz := (yesMoney - lastMoney) / 100 // 日同比
//
//		week = dao.NewOrderDao().GetWeekTotalMoney(0).Unwrap().(int64)     // 本周
//		yesWeek = dao.NewOrderDao().GetWeekTotalMoney(1).Unwrap().(int64)  // 上周
//		lastWeek = dao.NewOrderDao().GetWeekTotalMoney(2).Unwrap().(int64) // 上上周
//
//		//weekzz := (week - yesWeek) / 100                                   // 周同比
//		weekzz = (yesWeek - lastWeek) / 100 // 周同比
//
//		dataTotalMoney := dao.NewOrderDao().GetTotalMoney()
//		totalMoney = dataTotalMoney.Unwrap().(int64) // 已结算的订单总金额
//		totalCount = dataTotalMoney.Val().(int64)    // 已结算的订单总笔数
//
//		deviceCount = dao.NewDeviceDao().GetDeviceCount().Unwrap().(int64)
//		todayOrderCount = dao.NewOrderDao().GetTodayOrderCount(time.Now().Format("2006-01-02")).Unwrap().(int64)
//
//		usedDevice = dao.NewDeviceDao().GetUsedDeviceTotal().Unwrap().(int64)
//		deployDevice = dao.NewDeviceDao().GetDeployDeviceTotal().Unwrap().(int64)
//		deviceTypeCount = dao.NewDeviceDao().GetDeviceTotalByType().Unwrap().([]devices.DeviceTotal)
//
//	}
//
//	// 先一个一个的计算出来，没问题后，归类 到一张表里，然后定时更新
//	total := &struct {
//		OrderMoneyTotal        string                `json:"order_money_total"`    // 已完成的订单总金额
//		OrderCount             int64                 `json:"order_count"`          // 订单总笔数
//		TodayOrderTotalMoney   string                `json:"today_total_money"`    // 今日销售金额
//		YesOrderTotalMoney     string                `json:"yes_total_money"`      // 昨日销售金额
//		WeekOrderTotalMoney    string                `json:"week_total_money"`     // 本周销售金额
//		YesWeekOrderTotalMoney string                `json:"yes_week_total_money"` // 上周销售金额
//		TodayOrderCount        int64                 `json:"today_order_count"`    // 今日销售订单数
//		Balance                string                `json:"balance"`              // 余额
//		DeviceCount            int64                 `json:"device_count"`         // 设备条数
//		DayCompared            int64                 `json:"day_compared"`         // 日同比
//		WeekCompared           int64                 `json:"week_compared"`        // 周同比
//		TodayBalance           string                `json:"today_balance"`        // 当天入帐
//		UsedDevice             int64                 `json:"used_device"`          // 使用中的设备 (所有类型的设备)
//		DeployDevice           int64                 `json:"deploy_device"`        // 已部署的设备 (所有类型的设备)
//		DeviceTypeCount        []devices.DeviceTotal `json:"device_type_count"`    // 设备类型统计
//	}{
//		OrderMoneyTotal:        utils.Fen2Yuan(totalMoney),
//		OrderCount:             totalCount,
//		Balance:                balance,
//		DeviceCount:            deviceCount,
//		DayCompared:            todayzz,
//		WeekCompared:           weekzz,
//		TodayOrderTotalMoney:   utils.Fen2Yuan(todayMoney),
//		TodayOrderCount:        todayOrderCount,
//		TodayBalance:           tbalance,
//		UsedDevice:             usedDevice,
//		DeployDevice:           deployDevice,
//		DeviceTypeCount:        deviceTypeCount,
//		YesOrderTotalMoney:     utils.Fen2Yuan(yesMoney),
//		WeekOrderTotalMoney:    utils.Fen2Yuan(week),
//		YesWeekOrderTotalMoney: utils.Fen2Yuan(yesWeek),
//	}
//
//	Response(ctx)("", CodeSuccess, total)(OK)
//}
func GetLineCount(ctx *gin.Context) {
	// 总销售  总订单 设备总数
	userId, err := helper.GetUserIdFromCtx(ctx)
	if err != nil {
		Response(ctx)(err.Error(), CodeNeedLogin, nil)(Unauthorized)
		return
	}
	isAdmin, _ := helper.GetIsAdminFromCtx(ctx)
	//isPlace, _ := helper.GetIsPlaceFromCtx(ctx)
	IsDraw, _ := helper.GetIsDrawFromCtx(ctx)

	var balance, tbalance string
	var todayMoney, yesMoney, todayzz, week, yesWeek, weekzz, totalMoney, totalCount, deviceCount, todayOrderCount, usedDevice, deployDevice int64
	var deviceTypeCount []devices.DeviceTotal
	var w sync.WaitGroup

	// 销售额/支付笔数 总数
	w.Add(1)
	go func() {
		orderAll := dao.NewOrderDao().GetUserOrderMoneyAndCountAll(userId, isAdmin, IsDraw).Unwrap().([]int64)
		totalMoney = orderAll[0]
		totalCount = orderAll[1]
		w.Done()
	}()
	w.Add(1)
	go func() {
		usedDevice = dao.NewDeviceDao().GetUsedDeviceTotalOrderPlaces(userId, isAdmin, IsDraw).Unwrap().(int64) // 使用中设备数
		w.Done()
	}()
	w.Add(1)
	go func() {
		// 余额
		d := dao.NewOrderDao().GetDividendsMoneyByUserId(userId).Unwrap().(int64) // 分红
		c := dao.NewOrderDao().GetCashLogByUserId(userId).Unwrap().(int64)        // 提现
		balance = fmt.Sprintf("%.2f", float64(d-c)/100)
		w.Done()
	}()

	// 销售额/支付笔数 今天
	orderDay := dao.NewOrderDao().GetUserOrderMoneyAndCountDay(userId, isAdmin, IsDraw, 0).Unwrap().([]int64)
	todayMoney = orderDay[0]
	todayOrderCount = orderDay[1]

	// 销售额 昨天
	orderYes := dao.NewOrderDao().GetUserOrderMoneyAndCountDay(userId, isAdmin, IsDraw, 1).Unwrap().([]int64)
	yesMoney = orderYes[0]

	// 销售额 上周
	orderYesWeek := dao.NewOrderDao().GetUserOrderMoneyAndCountWeek(userId, isAdmin, IsDraw, 0).Unwrap().([]int64)
	yesWeek = orderYesWeek[0]

	// 当天入帐
	td := dao.NewOrderDao().GetTodayDividendsMoneyByUserId(userId).Unwrap().(int64) // 当天分红
	tbalance = fmt.Sprintf("%.2f", float64(td)/100)

	// 设备查询
	if isAdmin != helper.TypeNumIsAdminOperator {
		userIdArr := dao.NewUserDao().QueryChildUserIds(userId).Unwrap().([]int)
		placesIdArr := dao.NewUserDao().GetPlacesIds(userId, userIdArr).Unwrap().([]int)
		deployDevice = dao.NewDeviceDao().GetDeployDeviceTotalPlaces(placesIdArr).Unwrap().(int64) // 已部署密码线统计
		deviceTypeCount = dao.NewDeviceDao().GetDeviceTotalByTypePlaces(placesIdArr).Unwrap().([]devices.DeviceTotal)
	} else {
		deployDevice = dao.NewDeviceDao().GetDeployDeviceTotal().Unwrap().(int64)
		deviceTypeCount = dao.NewDeviceDao().GetDeviceTotalByType().Unwrap().([]devices.DeviceTotal)
	}
	for _, item := range deviceTypeCount {
		deviceCount += int64(item.DeviceTotal)
	}
	w.Wait()

	////分公司
	//if isPlace == 3 {
	//	//没有抽单权限
	//	// 余额 = (分红+抽单)-提现
	//	d := dao.NewOrderDao().GetDividendsMoneyByUserId(userId).Unwrap().(int64) // 分红
	//	//t := dao.NewOrderDao().GetTakeTotalMoneyByUserId(userId).Unwrap().(int64) // 抽单
	//	c := dao.NewOrderDao().GetCashLogByUserId(userId).Unwrap().(int64) // 提现
	//	//balance = utils.Fen2Yuan((d + t) - c)                                     // 余额
	//	balance = decimal.NewFromInt(d).Sub(decimal.NewFromInt(c)).
	//		Div(decimal.NewFromInt(100)).Truncate(2).String()
	//
	//	// 今日入帐 = (分红+抽单)-提现
	//	td := dao.NewOrderDao().GetTodayDividendsMoneyByUserId(userId).Unwrap().(int64) // 当天分红
	//	//tt := dao.NewOrderDao().GetTodayTakeTotalMoneyByUserId(userId, isAdmin).Unwrap().(int64) // 当天抽单
	//	tc := dao.NewOrderDao().GetTodayCashLogByUserId(userId).Unwrap().(int64) // 当天提现
	//	//tbalance = utils.Fen2Yuan((td + tt) - tc)                                        // 当天入帐
	//	tbalance = decimal.NewFromInt(td).Sub(decimal.NewFromInt(tc)).
	//		Div(decimal.NewFromInt(100)).Truncate(2).String()
	//
	//	childUserIds := dao.NewUserDao().QueryChildUserIds(userId).Unwrap().([]int)
	//	placesIdArr := dao.NewUserDao().GetPlacesIds(userId, childUserIds).Unwrap().([]int)
	//
	//	//当天的销售额
	//	todayMoney = dao.NewOrderDao().QueryPlacesTodayTotalMoney(time.Now().Format("2006-01-02"), placesIdArr).Unwrap().(int64) // 当天的销售额
	//
	//	// 前日销售额
	//	//lastMoney := dao.NewOrderDao().
	//	//	GetTodayTotalMoney(time.Now().AddDate(0, 0, -2).Format("2006-01-02")).
	//	//	Unwrap().(int64)
	//	// 昨日销售额
	//	yesMoney = dao.NewOrderDao().
	//		QueryPlacesTodayTotalMoney(time.Now().AddDate(0, 0, -1).Format("2006-01-02"), placesIdArr).
	//		Unwrap().(int64)
	//	todayzz = (todayMoney - yesMoney) / 100 // 日同比
	//	//todayzz := (yesMoney - lastMoney) / 100 // 日同比
	//
	//	//week = dao.NewOrderDao().GetWeekTotalMoney(0).Unwrap().(int64)     // 本周
	//	yesWeek = dao.NewOrderDao().GetWeekTotalMoneyPlaces(1, placesIdArr).Unwrap().(int64) // 上周
	//	//lastWeek = dao.NewOrderDao().GetWeekTotalMoney(2).Unwrap().(int64) // 上上周
	//
	//	//weekzz := (week - yesWeek) / 100                                   // 周同比
	//	//weekzz = (yesWeek - lastWeek) / 100 // 周同比
	//
	//	dataTotalMoney := dao.NewOrderDao().GetTotalMoneyPlaces(placesIdArr)
	//	totalMoney = dataTotalMoney.Unwrap().(int64) // 已结算的订单总金额
	//	totalCount = dataTotalMoney.Val().(int64)    // 已结算的订单总笔数
	//	deviceCount = dao.NewDeviceDao().GetDeviceCountPlaces(placesIdArr).Unwrap().(int64)
	//	todayOrderCount = dao.NewOrderDao().GetTodayOrderCountPlaces(time.Now().Format("2006-01-02"), placesIdArr).Unwrap().(int64)
	//
	//	usedDevice = dao.NewDeviceDao().GetUsedDeviceTotalPlaces(placesIdArr).Unwrap().(int64)     //获取代理设备总条数
	//	deployDevice = dao.NewDeviceDao().GetDeployDeviceTotalPlaces(placesIdArr).Unwrap().(int64) //已部署密码线统计
	//	deviceTypeCount = dao.NewDeviceDao().GetDeviceTotalByTypePlaces(placesIdArr).Unwrap().([]devices.DeviceTotal)
	//
	//}
	//
	////代理商
	//if isAdmin == 3 && isPlace != 3 { // 代理商 如果也享受抽单功能的话，需要判断一下
	//	log.Println(userId)
	//	//查询代理商是否能抽单
	//	_, rowsAffected := dao.NewUserDao().GetAgentIsDraw(userId)
	//
	//	//享受抽单功能
	//	if rowsAffected > 0 {
	//		// 余额 = (分红+抽单)-提现
	//		d := dao.NewOrderDao().GetDividendsMoneyByUserId(userId).Unwrap().(int64) // 分红
	//		//t := dao.NewOrderDao().GetTakeTotalMoneyByUserId(userId).Unwrap().(int64) // 抽单
	//		c := dao.NewOrderDao().GetCashLogByUserId(userId).Unwrap().(int64) // 提现
	//		//balance = utils.Fen2Yuan((d + t) - c)                                     // 余额
	//		balance = decimal.NewFromInt(d).Sub(decimal.NewFromInt(c)).
	//			Div(decimal.NewFromInt(100)).Truncate(2).String()
	//
	//		// 今日入帐 = (分红+抽单)-提现
	//		td := dao.NewOrderDao().GetTodayDividendsMoneyByUserId(userId).Unwrap().(int64) // 当天分红
	//		//tt := dao.NewOrderDao().GetTodayTakeTotalMoneyByUserId(userId, isAdmin).Unwrap().(int64) // 当天抽单
	//		tc := dao.NewOrderDao().GetTodayCashLogByUserId(userId).Unwrap().(int64) // 当天提现
	//		//tbalance = utils.Fen2Yuan((td + tt) - tc)                                        // 当天入帐
	//		tbalance = decimal.NewFromInt(td).Sub(decimal.NewFromInt(tc)).
	//			Div(decimal.NewFromInt(100)).Truncate(2).String()
	//	} else {
	//		//没有抽单权限
	//		// 余额 = (分红+抽单)-提现
	//		d := dao.NewOrderDao().GetDividendsMoneyByUserId(userId).Unwrap().(int64) // 分红
	//		//t := dao.NewOrderDao().GetTakeTotalMoneyByUserId(userId).Unwrap().(int64) // 抽单
	//		c := dao.NewOrderDao().GetCashLogByUserId(userId).Unwrap().(int64) // 提现
	//		//balance = utils.Fen2Yuan((d + t) - c)                                     // 余额
	//		balance = decimal.NewFromInt(d).Sub(decimal.NewFromInt(c)).
	//			Div(decimal.NewFromInt(100)).Truncate(2).String()
	//
	//		// 今日入帐 = (分红+抽单)-提现
	//		td := dao.NewOrderDao().GetTodayDividendsMoneyByUserId(userId).Unwrap().(int64) // 当天分红
	//		//tt := dao.NewOrderDao().GetTodayTakeTotalMoneyByUserId(userId, isAdmin).Unwrap().(int64) // 当天抽单
	//		tc := dao.NewOrderDao().GetTodayCashLogByUserId(userId).Unwrap().(int64) // 当天提现
	//		//tbalance = utils.Fen2Yuan((td + tt) - tc)                                        // 当天入帐
	//		tbalance = decimal.NewFromInt(td).Sub(decimal.NewFromInt(tc)).
	//			Div(decimal.NewFromInt(100)).Truncate(2).String()
	//	}
	//
	//	userIdArr := dao.NewUserDao().QueryChildUserIds(userId).Unwrap().([]int)
	//	log.Println(userIdArr)
	//
	//	//当天的销售额
	//	todayMoney = dao.NewOrderDao().QueryChildTodayTotalMoney(time.Now().Format("2006-01-02"), userIdArr).Unwrap().(int64) // 当天的销售额
	//
	//	// 前日销售额
	//	//lastMoney := dao.NewOrderDao().
	//	//	GetTodayTotalMoney(time.Now().AddDate(0, 0, -2).Format("2006-01-02")).
	//	//	Unwrap().(int64)
	//	// 昨日销售额
	//	yesMoney = dao.NewOrderDao().
	//		QueryChildTodayTotalMoney(time.Now().AddDate(0, 0, -1).Format("2006-01-02"), userIdArr).
	//		Unwrap().(int64)
	//	todayzz = (todayMoney - yesMoney) / 100 // 日同比
	//	//todayzz := (yesMoney - lastMoney) / 100 // 日同比
	//
	//	//week = dao.NewOrderDao().GetWeekTotalMoney(0).Unwrap().(int64)     // 本周
	//	yesWeek = dao.NewOrderDao().GetWeekTotalMoneyChild(1, userIdArr).Unwrap().(int64) // 上周
	//	//lastWeek = dao.NewOrderDao().GetWeekTotalMoney(2).Unwrap().(int64) // 上上周
	//
	//	//weekzz := (week - yesWeek) / 100                                   // 周同比
	//	//weekzz = (yesWeek - lastWeek) / 100 // 周同比
	//
	//	dataTotalMoney := dao.NewOrderDao().GetTotalMoneyChild(userIdArr)
	//	totalMoney = dataTotalMoney.Unwrap().(int64) // 已结算的订单总金额
	//	totalCount = dataTotalMoney.Val().(int64)    // 已结算的订单总笔数
	//	deviceCount = dao.NewDeviceDao().GetDeviceCountChild(userIdArr).Unwrap().(int64)
	//	todayOrderCount = dao.NewOrderDao().GetTodayOrderCountChild(time.Now().Format("2006-01-02"), userIdArr).Unwrap().(int64)
	//
	//	usedDevice = dao.NewDeviceDao().GetUsedDeviceTotalChild(userIdArr).Unwrap().(int64)
	//	deployDevice = dao.NewDeviceDao().GetDeployDeviceTotalChild(userIdArr).Unwrap().(int64)
	//	deviceTypeCount = dao.NewDeviceDao().GetDeviceTotalByTypeChild(userIdArr).Unwrap().([]devices.DeviceTotal)
	//
	//}
	//// 运营商或管理员
	//if isAdmin == 2 {
	//
	//	// 余额 = (分红+抽单)-提现
	//	d := dao.NewOrderDao().GetDividendsMoneyByUserId(userId).Unwrap().(int64) // 分红
	//	//t := dao.NewOrderDao().GetTakeTotalMoneyByUserId(userId).Unwrap().(int64) // 抽单
	//	c := dao.NewOrderDao().GetCashLogByUserId(userId).Unwrap().(int64) // 提现
	//	//balance = utils.Fen2Yuan((d + t) - c)                                     // 余额
	//	balance = decimal.NewFromInt(d).Sub(decimal.NewFromInt(c)).
	//		Div(decimal.NewFromInt(100)).Truncate(2).String()
	//
	//	// 今日入帐 = (分红+抽单)-提现
	//	td := dao.NewOrderDao().GetTodayDividendsMoneyByUserId(userId).Unwrap().(int64) // 当天分红
	//	//tt := dao.NewOrderDao().GetTodayTakeTotalMoneyByUserId(userId, isAdmin).Unwrap().(int64) // 当天抽单
	//	tc := dao.NewOrderDao().GetTodayCashLogByUserId(userId).Unwrap().(int64) // 当天提现
	//	//tbalance = utils.Fen2Yuan((td + tt) - tc)                                                // 当天入帐
	//	tbalance = decimal.NewFromInt(td).Sub(decimal.NewFromInt(tc)).
	//		Div(decimal.NewFromInt(100)).Truncate(2).String()
	//
	//	todayMoney = dao.NewOrderDao().
	//		GetTodayTotalMoney(time.Now().Format("2006-01-02")).Unwrap().(int64) // 当天的销售额
	//	// 前日销售额
	//	//lastMoney := dao.NewOrderDao().
	//	//	GetTodayTotalMoney(time.Now().AddDate(0, 0, -2).Format("2006-01-02")).
	//	//	Unwrap().(int64)
	//	// 昨日销售额
	//	yesMoney = dao.NewOrderDao().
	//		GetTodayTotalMoney(time.Now().AddDate(0, 0, -1).Format("2006-01-02")).
	//		Unwrap().(int64)
	//	todayzz = (todayMoney - yesMoney) / 100 // 日同比
	//	//todayzz := (yesMoney - lastMoney) / 100 // 日同比
	//
	//	week = dao.NewOrderDao().GetWeekTotalMoney(0).Unwrap().(int64)     // 本周
	//	yesWeek = dao.NewOrderDao().GetWeekTotalMoney(1).Unwrap().(int64)  // 上周
	//	lastWeek = dao.NewOrderDao().GetWeekTotalMoney(2).Unwrap().(int64) // 上上周
	//
	//	//weekzz := (week - yesWeek) / 100                                   // 周同比
	//	weekzz = (yesWeek - lastWeek) / 100 // 周同比
	//
	//	dataTotalMoney := dao.NewOrderDao().GetTotalMoney()
	//	totalMoney = dataTotalMoney.Unwrap().(int64) // 已结算的订单总金额
	//	totalCount = dataTotalMoney.Val().(int64)    // 已结算的订单总笔数
	//
	//	deviceCount = dao.NewDeviceDao().GetDeviceCount().Unwrap().(int64)
	//	todayOrderCount = dao.NewOrderDao().GetTodayOrderCount(time.Now().Format("2006-01-02")).Unwrap().(int64)
	//
	//	usedDevice = dao.NewDeviceDao().GetUsedDeviceTotal().Unwrap().(int64)
	//	deployDevice = dao.NewDeviceDao().GetDeployDeviceTotal().Unwrap().(int64)
	//	deviceTypeCount = dao.NewDeviceDao().GetDeviceTotalByType().Unwrap().([]devices.DeviceTotal)
	//
	//}

	// 先一个一个的计算出来，没问题后，归类 到一张表里，然后定时更新
	total := &struct {
		OrderMoneyTotal        string                `json:"order_money_total"`    // 已完成的订单总金额
		OrderCount             int64                 `json:"order_count"`          // 订单总笔数
		TodayOrderTotalMoney   string                `json:"today_total_money"`    // 今日销售金额
		YesOrderTotalMoney     string                `json:"yes_total_money"`      // 昨日销售金额
		WeekOrderTotalMoney    string                `json:"week_total_money"`     // 本周销售金额
		YesWeekOrderTotalMoney string                `json:"yes_week_total_money"` // 上周销售金额
		TodayOrderCount        int64                 `json:"today_order_count"`    // 今日销售订单数
		Balance                string                `json:"balance"`              // 余额
		DeviceCount            int64                 `json:"device_count"`         // 设备条数
		DayCompared            int64                 `json:"day_compared"`         // 日同比
		WeekCompared           int64                 `json:"week_compared"`        // 周同比
		TodayBalance           string                `json:"today_balance"`        // 当天入帐
		UsedDevice             int64                 `json:"used_device"`          // 使用中的设备 (所有类型的设备)
		DeployDevice           int64                 `json:"deploy_device"`        // 已部署的设备 (所有类型的设备)
		DeviceTypeCount        []devices.DeviceTotal `json:"device_type_count"`    // 设备类型统计
	}{
		OrderMoneyTotal:        utils.Fen2Yuan(totalMoney),
		OrderCount:             totalCount,
		Balance:                balance,
		DeviceCount:            deviceCount,
		DayCompared:            todayzz,
		WeekCompared:           weekzz,
		TodayOrderTotalMoney:   utils.Fen2Yuan(todayMoney),
		TodayOrderCount:        todayOrderCount,
		TodayBalance:           tbalance,
		UsedDevice:             usedDevice,
		DeployDevice:           deployDevice,
		DeviceTypeCount:        deviceTypeCount,
		YesOrderTotalMoney:     utils.Fen2Yuan(yesMoney),
		WeekOrderTotalMoney:    utils.Fen2Yuan(week),
		YesWeekOrderTotalMoney: utils.Fen2Yuan(yesWeek),
	}

	Response(ctx)("", CodeSuccess, total)(OK)
}

// 使用率排行
func GetRankList(ctx *gin.Context) {

	param := &request.OrderTotalReq{}
	dingo.ErrorIf(ctx.ShouldBindQuery(param)).Unwrap()
	userId, err := helper.GetUserIdFromCtx(ctx) // 获取当前代理商ID
	if err != nil {
		Response(ctx)(err.Error(), CodeNeedLogin, nil)(Unauthorized)
		return
	}
	isAdmin, err := helper.GetIsAdminFromCtx(ctx) // 从上下文中获取用户是否为管理员
	if err != nil {
		Response(ctx)(err.Error(), CodeNeedLogin, nil)(Unauthorized)
		return
	}
	isPlace, err := helper.GetIsPlaceFromCtx(ctx)
	if err != nil {
		Response(ctx)(err.Error(), CodeNeedLogin, nil)(Unauthorized)
		return
	}
	param.IsPlace = isPlace
	param.IsAdmin = isAdmin
	param.UserId = userId

	orderData := dao.NewOrderDao().GetPlaceUsedRateList(param)
	// 响应请求
	Response(ctx)("", CodeSuccess,
		ResponseList{
			PageNo:   param.PageNo,
			PageSize: param.PageSize,
			//TotalCount: dao.NewOrderDao().CountPlaceUsedRateList(param).Unwrap().(int64),
			TotalCount: orderData.Val().(int64),
			TotalPage:  0,
			Data:       orderData.Unwrap(),
		},
	)(OK)
}

func GetRankCount(ctx *gin.Context) {

	day := 30
	sharedMode := "pcl"
	param := &struct {
		SearchTime string `json:"searchTime" form:"searchTime"` // 查询条件：时间
		SharedMode string `json:"sharedMode" form:"sharedMode"`
	}{}
	dingo.ErrorIf(ctx.ShouldBindQuery(param)).Unwrap()
	userId, err := helper.GetUserIdFromCtx(ctx) // 获取当前代理商ID
	if err != nil {
		Response(ctx)(err.Error(), CodeNeedLogin, nil)(Unauthorized)
		return
	}
	isAdmin, err := helper.GetIsAdminFromCtx(ctx) // 从上下文中获取用户是否为管理员
	if err != nil {
		Response(ctx)(err.Error(), CodeNeedLogin, nil)(Unauthorized)
		return
	}

	if param.SearchTime != "" {
		day, _ = strconv.Atoi(param.SearchTime)
	}
	if param.SharedMode != "" {
		sharedMode = param.SharedMode
	}
	data := dao.NewOrderDao().GetOrderTotalAndCount(day, sharedMode, userId, isAdmin)
	// 响应请求
	Response(ctx)("", CodeSuccess, &struct {
		OrderTotal int64 `json:"orderTotal"`
		OrderCount int64 `json:"orderCount"`
	}{
		OrderTotal: data.Unwrap().(int64),
		OrderCount: data.Val().(int64),
	},
	)(OK)
}

// 最近10天的支付笔数图表
func GetPayCountList(ctx *gin.Context) {
	// 总销售  总订单 设备总数
	userId, err := helper.GetUserIdFromCtx(ctx)
	if err != nil {
		Response(ctx)(err.Error(), CodeNeedLogin, nil)(Unauthorized)
		return
	}
	isAdmin, err := helper.GetIsAdminFromCtx(ctx)
	if err != nil {
		Response(ctx)(err.Error(), CodeNeedLogin, nil)(Unauthorized)
		return
	}

	//isPlace, err := helper.GetIsPlaceFromCtx(ctx)
	//if err != nil {
	//	Response(ctx)(err.Error(), CodeNeedLogin, nil)(Unauthorized)
	//	return
	//}

	//代理商
	//isAdmin == 3 && isPlace != 3
	if isAdmin > helper.TypeNumIsAdminStaff {
		_, rowsAffected := dao.NewUserDao().GetAgentIsDraw(userId)

		if rowsAffected != 0 {
			userIdArr := dao.NewUserDao().QueryChildUserIds(userId).Unwrap().([]int)

			Response(ctx)("", CodeSuccess, dao.NewOrderDao().GetLastDayOrderCountChild(10, userIdArr).Unwrap())(OK)
			return
		}

	}

	if isAdmin == helper.TypeNumIsAdminBranch {
		placesIdArr := dao.NewUserDao().GetPlacesId(userId).Unwrap().([]int)
		Response(ctx)("", CodeSuccess, dao.NewOrderDao().GetLastDayOrderCountPlaces(10, placesIdArr).Unwrap())(OK)
		return
	}

	Response(ctx)("", CodeSuccess, dao.NewOrderDao().GetLastDayOrderCount(10).Unwrap())(OK)
}

// 最近10天的余额图表
func GetBalanceRankList(ctx *gin.Context) {
	userId, err := helper.GetUserIdFromCtx(ctx)
	if err != nil {
		dingo.ErrorIf(err).Unwrap()
	}
	// 分红
	dTotal := dao.NewOrderDao().GetLastDayDividendsTotalByParentId(userId).Unwrap().([]*resphelper.ChartResp)
	//log.Println("分红", dTotal)
	// 抽单
	drawTotal := dao.NewOrderDao().GetLastDayDrawTotalByParentId(userId).Unwrap().([]*resphelper.ChartResp)
	//log.Println("抽单", drawTotal)

	//for _, aa := range drawTotal {
	//
	//	log.Println("现在抽单的值：",aa.X,aa.Y)
	//}
	var result []*resphelper.ChartResp
	// 将分红放入List
	for _, divid := range dTotal {
		result = append(result, &resphelper.ChartResp{X: divid.X, Y: divid.Y})
	}
	// 将抽单放入List
	for _, draw := range drawTotal {
		result = append(result, &resphelper.ChartResp{X: draw.X, Y: draw.Y})
	}

	// 整理成map，日期做为key，日期相同值相加
	balanceResultMap := make(map[string]float64)
	for _, balance := range result {

		key := balance.X
		value := balance.Y

		if balanceResultMap[key] > 0 {
			// 日期相同，直接相加
			y, _ := decimal.NewFromFloat(value).Add(decimal.NewFromFloat(balanceResultMap[key])).Float64()
			balanceResultMap[key] = y
		} else {
			balanceResultMap[key] = value
		}

	}

	var balanceResult []*resphelper.ChartResp
	// 把mpa转成List
	for k, v := range balanceResultMap {
		balanceResult = append(balanceResult, &resphelper.ChartResp{X: k, Y: v})
	}

	Response(ctx)("", CodeSuccess, balanceResult)(OK)
}

// 最近30天的 销售额图表
func GetTotalRankList(ctx *gin.Context) {
	Response(ctx)("", CodeSuccess, dao.NewOrderDao().GetLastDayOrderTotal(30).Unwrap())(OK)
}

// 根据时间范围获取 销售总额
func GetSalesList(ctx *gin.Context) {
	param := &struct {
		SharedMode string `form:"sharedMode"` // 共享模型
		TimeRange  string `form:"timeRange"`  // 查询条件时间
	}{}

	dingo.ErrorIf(ctx.ShouldBindQuery(param)).Unwrap()

	userId, err := helper.GetUserIdFromCtx(ctx) // 获取当前代理商ID
	if err != nil {
		Response(ctx)(err.Error(), CodeNeedLogin, nil)(Unauthorized)
		return
	}
	isAdmin, err := helper.GetIsAdminFromCtx(ctx) // 从上下文中获取用户是否为管理员
	if err != nil {
		Response(ctx)(err.Error(), CodeNeedLogin, nil)(Unauthorized)
		return
	}

	isPlace, err := helper.GetIsPlaceFromCtx(ctx)
	if err != nil {
		Response(ctx)(err.Error(), CodeNeedLogin, nil)(Unauthorized)
		return
	}

	lineData := dao.NewOrderDao().GetDeviceSales(param.SharedMode, param.TimeRange, isAdmin, userId, isPlace).Unwrap()
	rankData := dao.NewOrderDao().GetPlaceSalesRankList(param.SharedMode, param.TimeRange, 7, isAdmin, userId, isPlace).Unwrap()

	Response(ctx)("", CodeSuccess, &struct {
		LineData []*resphelper.ChartListResp `json:"lineData"`
		RankData []*placeresp.PlaceRankList     `json:"rankData"`
	}{
		LineData: lineData.([]*resphelper.ChartListResp),
		RankData: rankData.([]*placeresp.PlaceRankList),
	})(OK)
}
